/**
* createStore 函数接收一个 reducer 函数作为参数, 用于创建一个 Redux store.
*
* @param {Function} reducer - 一个接收 state 和 action 作为参数的函数, 用于计算新的 state.
* @returns {Object} - 一个包含 getState, subscribe 和 dispatch 方法的对象, 用于与 Redux 应用程序交互.
*/
function createStore(reducer) {
 let state; // 初始 state
 let listeners = []; // 用于存储订阅的监听器

 /**
 * getState 函数用于获取当前的 state.
 *
 * @returns {Object} - 当前的 state.
 */
 function getState() {
   return state;
 }

 /**
 * subscribe 函数接收一个监听器函数作为参数, 用于订阅 state 的变化.
 *
 * @param {Function} listener - 一个接收 state 作为参数的函数, 当 state 发生变化时, 该函数将被调用.
 * @returns {Function} - 一个用于取消订阅的函数.
 */
 function subscribe(listener) {
   listeners.push(listener);
   return () => {
     listeners = listeners.filter((l) => l !== listener);
   };
 }

 /**
 * dispatch 函数用于触发一个 action, 并更新 state.
 *
 * @param {Object} action - 一个包含 type 属性的对象, 用于表示要执行的操作.
 */
 function dispatch(action) { 
  //判断 action 数据的类型   {type: 'add', payload: 10}
  if(typeof action === 'object'){
    state = reducer(state, action);
    listeners.forEach((listener) => listener());
  }
  if(typeof action === 'function'){
    //如果 action 为函数, 调用该函数
    action(dispatch);
  }
 }

 // 初始化 state
 dispatch({type: '@@redux/INIT'}); // 初始化 state

 return {
   getState,
   subscribe,
   dispatch
 };
}
